{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第三周作业——XGBoost"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "采用xgboost模型完成商品分类（需进行参数调优）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import xgboost as xgb\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "from xgboost import XGBClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "dtrain = pd.read_csv('RentListingInquries_FE_train.csv')\n",
    "dtest = pd.read_csv('RentListingInquries_FE_test.csv')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(49352, 228)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtrain.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(74659, 227)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtest.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtrain.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>virtual</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2950</td>\n",
       "      <td>1475.000000</td>\n",
       "      <td>1475.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>11</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>950.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3758</td>\n",
       "      <td>1879.000000</td>\n",
       "      <td>1879.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>3300</td>\n",
       "      <td>1650.000000</td>\n",
       "      <td>1100.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>11</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "      <td>4900</td>\n",
       "      <td>1633.333333</td>\n",
       "      <td>1633.333333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 227 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.0         1   2950      1475.000000     1475.000000        0.0   \n",
       "1        1.0         2   2850      1425.000000      950.000000       -1.0   \n",
       "2        1.0         1   3758      1879.000000     1879.000000        0.0   \n",
       "3        1.0         2   3300      1650.000000     1100.000000       -1.0   \n",
       "4        2.0         2   4900      1633.333333     1633.333333        0.0   \n",
       "\n",
       "   room_num  Year  Month  Day  ...   virtual  walk  walls  war  washer  water  \\\n",
       "0       2.0  2016      6   11  ...         0     0      0    0       0      0   \n",
       "1       3.0  2016      6   24  ...         0     0      0    1       0      0   \n",
       "2       2.0  2016      6    3  ...         0     0      0    0       0      0   \n",
       "3       3.0  2016      6   11  ...         0     0      0    0       0      0   \n",
       "4       4.0  2016      4   12  ...         0     0      0    1       0      0   \n",
       "\n",
       "   wheelchair  wifi  windows  work  \n",
       "0           0     0        0     0  \n",
       "1           0     0        0     0  \n",
       "2           0     0        0     0  \n",
       "3           1     0        0     0  \n",
       "4           0     0        0     0  \n",
       "\n",
       "[5 rows x 227 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtest.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = dtrain['interest_level']\n",
    "train=dtrain.drop([\"interest_level\"], axis=1)\n",
    "X_train =np.array(train) \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "X_test=np.array(dtest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1be4e4945c0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(y_train);\n",
    "pyplot.xlabel('target');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 初步确定弱学习器数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#直接调用xgboost内嵌的交叉验证（cv），可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证\n",
    "def modelfit(alg, X_train, y_train, cv_folds=None, early_stopping_rounds=10):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param['num_class'] = 3\n",
    "    \n",
    "    #直接调用xgboost，而非sklarn的wrapper类\n",
    "    xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "        \n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "             metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "  \n",
    "    cvresult.to_csv('1_nestimators.csv', index_label = 'n_estimators')\n",
    "    \n",
    "    #最佳参数n_estimators\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    \n",
    "    # 采用交叉验证得到的最佳参数n_estimators，训练模型\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')\n",
    "        \n",
    "    #Predict training set:\n",
    "    #train_predprob = alg.predict_proba(X_train)\n",
    "    #logloss = log_loss(y_train, train_predprob)\n",
    "\n",
    "   #Print model report:\n",
    "   # print (\"logloss of train :\" )\n",
    "   # print logloss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "xgb1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=1000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.4,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb1, X_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d022504f98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "        \n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators4_1.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1oAAANICAYAAADevJ4OAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XeYFFXaxuHnJccBBATJooiisgiIShJRDIgZc8Cwa9bF\nuGsOn9k157Bizq4JM0kUFARERDAggghIhiFO4nx/VHVVdTszzAw10xN+93X1xTlV1dWnZwboZ86p\nt8w5JwAAAABAfKqlewAAAAAAUNkQtAAAAAAgZgQtAAAAAIgZQQsAAAAAYkbQAgAAAICYEbQAAAAA\nIGYELQAAAACIGUELAAAAAGJG0AIAAACAmBG0AACVhpk9a2bz0j0OAAAIWgCqDDN70cw2mdlO+ez7\nt5k5MxuSsr22mV1kZl+a2SozyzazRWb2npmdaGbVI8d28M8RfWSa2XQzuzB6bLqY2flmdnq6x7E1\nzKyVmd1oZt3SPZYoMzvJzIanexxlycwG+D/nQ8vBWBJ//y5P91gAQJJqpHsAAFCGLpU0WNLjkgYm\nNprZ9pKul/SWc25kZHtzSR9J6iHpE0m3SFopqaWkAyS9LGlHSf+X8jqvSPrQbzfyX/MhSe0lXRH3\nmyqm8yUtl/RsmsexNVpJukHSPEnTU/b9Q+n7JeJJknaTdH+aXh8AUI4QtABUGc65pWb2L0lPmtkw\n59xz/q5HJeVI+mfKU16QtIekY5xz/0vZd7uZ9ZTUOZ+XmuacezHRMbNHJU2S90E83UGrUnPO5aR7\nDHEysxqSqjnnstM9FgBA8bB0EEBV87SkCZL+Y2ZNzewESQdLutY5tzBxkJntI+kgSU/mE7IkSc65\nKc65l7b0gs45J2mJpNzUff5Svh/MLMtfkviImTXO57hjzWyqmW00s+X+MsjWKce0NLMRZvaHf77F\nZvaumXXw98+TtKukfSNLG8cVNO7oUiwzO9vMfvXP+42Z7bml953P+Wqb2U1mNsc/zwIzu8vMaqcc\nN8hfqrnazNaZ2U9mdpu/b4Ckb/xDR0Tex+n+/qRrtFLewwVmNtfMNpjZp2bW1jzX+V+zjf7Xa5uU\n8RxhZh/4358s/+twXcqy0XGSDpXUPjKm6Di2NbP/mtkSf/nqd2Y2rJCv93Az+1VSlqQu/v6L/J+V\nDeYtY51iZicV8vVuYWa5ZnZDPvs6+691od+vaWY3mNkv/vhW+N+DQQWdvzjMrL6Z3eN/z7P87+nl\n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\nSVKVWWhJkiRJUpVZaEmSJElSlVloSZIkSVKVWWhJkiRJUpVZaEmSJElSlVloSZIkSVKVWWhJkiRJ\nUpVZaEmSJElSlVloSZIkSVKVWWhJkiRJUpVZaEmSJElSlVloSZIkSVKVWWhJkiRJUpVZaEmSJElS\nlVloSZIkSVKVWWhJkiRJUpVZaEmSJElSlVloSZIkSVKVWWhJkiRJUpVZaEmSJElSlVloSZIkSVKV\nWWhJkiRJUpVZaEmSJElSlVloSZIkSVKVWWhJkiRJUpVZaEmSJElSlVloSZIkSVKVWWhJkiRJUpVZ\naEmSJElSlc1b7wQaWXd3d71TkCRJklRHo60JIqVU5VSaX0QsDzxd7zwkSZIkNYwVUkrPDPdgC60B\nREQAywGv1zuXikUoCr8VaJycWonXd2x5fceW13dseX3Hltd3bHl9x5bXd2w12vVdBHg2jaB4cujg\nACoXcNjV6lgr6j4AXk8pOZ6xyry+Y8vrO7a8vmPL6zu2vL5jy+s7try+Y6sBr++Ic3AxDEmSJEmq\nMgstSZIkSaoyC63mMAP4XuWnqs/rO7a8vmPL6zu2vL5jy+s7try+Y8vrO7aa/vq6GIYkSZIkVZk9\nWpIkSZJUZRZakiRJklRlFlqSJEmSVGUWWpIkSZJUZRZadRIRm0bEpRHxbESkiNix3/6IiO9HxHMR\n8UZEXB0R7+x3zPiI+FVEvBwRUyLi9xGxdG0/SWMa6vpGxHwR8eOIuDciplaOOSsiluv3HpMq55Zf\nJ9b+0zSeYXx/Jw5w7S7vd4zf30EM4/r2v7a9r2+UjvH7O4CIODQibouI1yPihYi4OCLW6HeM99+5\nMKdr7D147gzzO+w9eJSGeX29B49SRBwQEfdERHfldXNEfLy0v6XuvxZa9TMBuBv4yiD7vwn8B7A/\n8CFgKnBFRIwvHXM8sD3wWeAjwHLARWOVcJMZ6vouBHwAOLLy81PAGsAlAxx7CrBs6fXNsUi2Cc3p\n+wtwOX2v3a799vv9Hdycru+y/V57Awn4fb/j/P7O7iPAr4ANgK2A+YArI2JC6Rjvv3NnTtfYe/Dc\nGc53GLwHj9Zwrq/34NF7GvgWsC6wHnAt8MeIeE9lf2vdf1NKvur8ovifc8dSO4DngK+XtnUC04Fd\nSu0e4DOlY95Vea8N6v2ZGunV//oOcswHK8etWNo2CfhpvfNv9NdA1xeYCFw8xDl+f+fi+g5wzMXA\n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\nAADALOCAXJ0n13DTAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d01d59f0b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "\n",
    "cvresult = cvresult.iloc[100:]\n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(100,cvresult.shape[0]+100)\n",
    "        \n",
    "fig = pyplot.figure(figsize=(10, 10), dpi=100)\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators_detail.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "301"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb1.get_params()['n_estimators']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "初步确定弱学习器数目为301"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 对max_depth和min_children_weight进行调优（粗调 + 细调）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': range(3, 10, 2), 'min_child_weight': range(1, 6, 2)}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = range(3,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Xiaomeng\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:747: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59575, std: 0.00300, params: {'min_child_weight': 1, 'max_depth': 3},\n",
       "  mean: -0.59599, std: 0.00323, params: {'min_child_weight': 3, 'max_depth': 3},\n",
       "  mean: -0.59567, std: 0.00303, params: {'min_child_weight': 5, 'max_depth': 3},\n",
       "  mean: -0.58588, std: 0.00463, params: {'min_child_weight': 1, 'max_depth': 5},\n",
       "  mean: -0.58608, std: 0.00380, params: {'min_child_weight': 3, 'max_depth': 5},\n",
       "  mean: -0.58561, std: 0.00377, params: {'min_child_weight': 5, 'max_depth': 5},\n",
       "  mean: -0.59107, std: 0.00382, params: {'min_child_weight': 1, 'max_depth': 7},\n",
       "  mean: -0.58890, std: 0.00292, params: {'min_child_weight': 3, 'max_depth': 7},\n",
       "  mean: -0.58842, std: 0.00396, params: {'min_child_weight': 5, 'max_depth': 7},\n",
       "  mean: -0.61165, std: 0.00302, params: {'min_child_weight': 1, 'max_depth': 9},\n",
       "  mean: -0.60367, std: 0.00519, params: {'min_child_weight': 3, 'max_depth': 9},\n",
       "  mean: -0.60052, std: 0.00538, params: {'min_child_weight': 5, 'max_depth': 9}],\n",
       " {'max_depth': 5, 'min_child_weight': 5},\n",
       " -0.58561190322888956)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=301,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.4,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective=  'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_,     gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "粗调的结果是，max_depth=5, min_child_weight =5. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [4, 5, 6], 'min_child_weight': [4, 5, 6]}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#进一步细调\n",
    "max_depth = [4,5,6]\n",
    "min_child_weight = [4,5,6]\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Xiaomeng\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:747: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.58934, std: 0.00370, params: {'min_child_weight': 4, 'max_depth': 4},\n",
       "  mean: -0.58912, std: 0.00397, params: {'min_child_weight': 5, 'max_depth': 4},\n",
       "  mean: -0.58922, std: 0.00336, params: {'min_child_weight': 6, 'max_depth': 4},\n",
       "  mean: -0.58621, std: 0.00364, params: {'min_child_weight': 4, 'max_depth': 5},\n",
       "  mean: -0.58561, std: 0.00377, params: {'min_child_weight': 5, 'max_depth': 5},\n",
       "  mean: -0.58583, std: 0.00396, params: {'min_child_weight': 6, 'max_depth': 5},\n",
       "  mean: -0.58586, std: 0.00421, params: {'min_child_weight': 4, 'max_depth': 6},\n",
       "  mean: -0.58548, std: 0.00409, params: {'min_child_weight': 5, 'max_depth': 6},\n",
       "  mean: -0.58536, std: 0.00382, params: {'min_child_weight': 6, 'max_depth': 6}],\n",
       " {'max_depth': 6, 'min_child_weight': 6},\n",
       " -0.58535744995499805)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=301,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.4,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid = param_test2_2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_2.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_2.grid_scores_, gsearch2_2.best_params_,     gsearch2_2.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "细调的结果是，max_depth=6, min_child_weight =6."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 正则参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'reg_alpha': [1.5, 2], 'reg_lambda': [0.5, 1, 2]}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg_alpha = [ 1.5, 2]    #default = 0, 测试0.1,1，1.5，2\n",
    "reg_lambda = [0.5, 1, 2]      #default = 1，测试0.1， 0.5， 1，2\n",
    "\n",
    "param_test3_1 = dict(reg_alpha=reg_alpha, reg_lambda=reg_lambda)\n",
    "param_test3_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Xiaomeng\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:747: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.58551, std: 0.00364, params: {'reg_lambda': 0.5, 'reg_alpha': 1.5},\n",
       "  mean: -0.58637, std: 0.00419, params: {'reg_lambda': 1, 'reg_alpha': 1.5},\n",
       "  mean: -0.58559, std: 0.00359, params: {'reg_lambda': 2, 'reg_alpha': 1.5},\n",
       "  mean: -0.58591, std: 0.00318, params: {'reg_lambda': 0.5, 'reg_alpha': 2},\n",
       "  mean: -0.58593, std: 0.00387, params: {'reg_lambda': 1, 'reg_alpha': 2},\n",
       "  mean: -0.58578, std: 0.00332, params: {'reg_lambda': 2, 'reg_alpha': 2}],\n",
       " {'reg_alpha': 1.5, 'reg_lambda': 0.5},\n",
       " -0.58551243884378557)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb3_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=301,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=6,#细调的结果6\n",
    "        gamma=0,\n",
    "        subsample=0.4,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch3_1 = GridSearchCV(xgb3_1, param_grid = param_test3_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch3_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch3_1.grid_scores_, gsearch3_1.best_params_,     gsearch3_1.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "正则参数：alpha=1.5 lambda=0.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.重新调整弱学习器数目"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "xgb4 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=1000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=6,\n",
    "        min_child_weight=6,#细调的6\n",
    "        gamma=0,\n",
    "        subsample=0.4,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3,\n",
    "        reg_alpha=1.5,#正则\n",
    "        reg_lambda=0.5)\n",
    "\n",
    "modelfit(xgb4, X_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "196"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb4.get_params()['n_estimators']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "调整后的弱学习器数为196."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6.  行列重采样参数调整"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'colsample_bytree': [0.6, 0.7, 0.8, 0.9],\n",
       " 'subsample': [0.3, 0.4, 0.5, 0.6, 0.7, 0.8]}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "subsample = [i/10.0 for i in range(3,9)]\n",
    "colsample_bytree = [i/10.0 for i in range(6,10)]\n",
    "param_test5_1 = dict(subsample=subsample, colsample_bytree=colsample_bytree)\n",
    "param_test5_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Xiaomeng\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:747: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.58799, std: 0.00403, params: {'subsample': 0.3, 'colsample_bytree': 0.6},\n",
       "  mean: -0.58626, std: 0.00357, params: {'subsample': 0.4, 'colsample_bytree': 0.6},\n",
       "  mean: -0.58544, std: 0.00393, params: {'subsample': 0.5, 'colsample_bytree': 0.6},\n",
       "  mean: -0.58430, std: 0.00435, params: {'subsample': 0.6, 'colsample_bytree': 0.6},\n",
       "  mean: -0.58245, std: 0.00374, params: {'subsample': 0.7, 'colsample_bytree': 0.6},\n",
       "  mean: -0.58233, std: 0.00364, params: {'subsample': 0.8, 'colsample_bytree': 0.6},\n",
       "  mean: -0.58861, std: 0.00377, params: {'subsample': 0.3, 'colsample_bytree': 0.7},\n",
       "  mean: -0.58595, std: 0.00346, params: {'subsample': 0.4, 'colsample_bytree': 0.7},\n",
       "  mean: -0.58444, std: 0.00328, params: {'subsample': 0.5, 'colsample_bytree': 0.7},\n",
       "  mean: -0.58361, std: 0.00437, params: {'subsample': 0.6, 'colsample_bytree': 0.7},\n",
       "  mean: -0.58279, std: 0.00338, params: {'subsample': 0.7, 'colsample_bytree': 0.7},\n",
       "  mean: -0.58226, std: 0.00323, params: {'subsample': 0.8, 'colsample_bytree': 0.7},\n",
       "  mean: -0.58899, std: 0.00293, params: {'subsample': 0.3, 'colsample_bytree': 0.8},\n",
       "  mean: -0.58609, std: 0.00350, params: {'subsample': 0.4, 'colsample_bytree': 0.8},\n",
       "  mean: -0.58451, std: 0.00322, params: {'subsample': 0.5, 'colsample_bytree': 0.8},\n",
       "  mean: -0.58266, std: 0.00350, params: {'subsample': 0.6, 'colsample_bytree': 0.8},\n",
       "  mean: -0.58241, std: 0.00313, params: {'subsample': 0.7, 'colsample_bytree': 0.8},\n",
       "  mean: -0.58215, std: 0.00252, params: {'subsample': 0.8, 'colsample_bytree': 0.8},\n",
       "  mean: -0.58916, std: 0.00283, params: {'subsample': 0.3, 'colsample_bytree': 0.9},\n",
       "  mean: -0.58543, std: 0.00383, params: {'subsample': 0.4, 'colsample_bytree': 0.9},\n",
       "  mean: -0.58489, std: 0.00391, params: {'subsample': 0.5, 'colsample_bytree': 0.9},\n",
       "  mean: -0.58347, std: 0.00343, params: {'subsample': 0.6, 'colsample_bytree': 0.9},\n",
       "  mean: -0.58256, std: 0.00355, params: {'subsample': 0.7, 'colsample_bytree': 0.9},\n",
       "  mean: -0.58187, std: 0.00331, params: {'subsample': 0.8, 'colsample_bytree': 0.9}],\n",
       " {'colsample_bytree': 0.9, 'subsample': 0.8},\n",
       " -0.58187242974667819)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb5_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=196,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=6,#细调的6\n",
    "        gamma=0,\n",
    "        subsample=0.4,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3,\n",
    "        reg_alpha=1.5,#正则\n",
    "        reg_lambda=0.5)\n",
    "\n",
    "\n",
    "gsearch5_1 = GridSearchCV(xgb5_1, param_grid = param_test5_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch5_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch5_1.grid_scores_, gsearch5_1.best_params_,     gsearch5_1.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "每棵树所用的训练样本采样率为0.8, 每棵树的列采样率为0.9"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7. 调用模型进行测试\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "xgb_final = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=196,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=6,#细调\n",
    "        gamma=0,\n",
    "        subsample=0.8,\n",
    "        colsample_bytree=0.9, #采样率\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3,\n",
    "        reg_alpha=1.5,#正则\n",
    "        reg_lambda=0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n",
       "       colsample_bytree=0.9, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "       max_depth=6, min_child_weight=6, missing=None, n_estimators=196,\n",
       "       n_jobs=1, nthread=None, objective='multi:softprob', random_state=0,\n",
       "       reg_alpha=1.5, reg_lambda=0.5, scale_pos_weight=1, seed=3,\n",
       "       silent=True, subsample=0.8)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb_final.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "train_predict=xgb_final.predict(X_train)\n",
    "train_predictions = [round(value) for value in train_predict]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Accuary: 79.70%\n"
     ]
    }
   ],
   "source": [
    "train_accuracy = accuracy_score(y_train, train_predictions)\n",
    "print (\"Train Accuary: %.2f%%\" % (train_accuracy * 100.0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "用调整过参数的XGBClassifier, 训练集上的准确率有79.70%"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "xgb_initial=XGBClassifier()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n",
       "       colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "       max_depth=3, min_child_weight=1, missing=None, n_estimators=100,\n",
       "       n_jobs=1, nthread=None, objective='multi:softprob', random_state=0,\n",
       "       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n",
       "       silent=True, subsample=1)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb_initial.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Accuary with a default XGBClassifier: 72.81%\n"
     ]
    }
   ],
   "source": [
    "train_predict_ini=xgb_initial.predict(X_train)\n",
    "train_predictions_ini = [round(value) for value in train_predict_ini]\n",
    "train_accuracy_ini = accuracy_score(y_train, train_predictions_ini)\n",
    "print (\"Train Accuary with a default XGBClassifier: %.2f%%\" % (train_accuracy_ini * 100.0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果我们用默认参数的XGBClassifier,训练集上的准确率只有72.81%。可见我们调整参数后，在训练集上的正确率有提升。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "test_predict=xgb_final.predict(X_test)\n",
    "test_predicts = [round(value) for value in test_predict]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEKCAYAAADaa8itAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGW1JREFUeJzt3XvQZVV55/HvDxoRo9y000UasHFonUFUlJZCzRgFDUQn\nwjiA7TjSY3VBLAjBymWETLwkDkYqXiIxkKEGIzgqtEQEjajYeBkdARvUIA0MHS7SPVxaQG4p0IZn\n/jjrHU6/9mU37POePv1+P1WnztrP2Wuf5/BW18Pea+21U1VIktSH7cadgCRp22FRkST1xqIiSeqN\nRUWS1BuLiiSpNxYVSVJvLCqSpN5YVCRJvbGoSJJ6M2fcCcy05zznObVgwYJxpyFJE+Xqq6/+WVXN\n3dx+s66oLFiwgBUrVow7DUmaKElu67Kfl78kSb0ZaVFJsmuSC5PckOT6JK9IsnuSy5Lc1N53G9r/\n1CSrktyY5LCh+IFJrm2fnZEkLb5jkgta/MokC0b5eyRJmzbqM5WPA1+tqn8NvAS4HjgFWF5VC4Hl\nbZsk+wGLgRcChwNnJtm+Hecs4DhgYXsd3uJLgfuqal/gY8DpI/49kqRNGFlRSbIL8GrgHICq+kVV\n/Rw4Aji37XYucGRrHwGcX1WPVtUtwCrgoCR7ADtX1RU1WKf/vGl9po51IXDo1FmMJGnmjfJMZR9g\nLfD3SX6Y5H8k+TVgXlXd0fa5E5jX2vOB24f6r26x+a09Pb5en6paB9wPPHt6IkmOT7IiyYq1a9f2\n8uMkSb9qlEVlDvAy4KyqeinwMO1S15R25jHyp4RV1dlVtaiqFs2du9kZcZKkJ2mURWU1sLqqrmzb\nFzIoMne1S1q097vb52uAvYb679lia1p7eny9PknmALsA9/T+SyRJnYysqFTVncDtSV7QQocCK4FL\ngCUttgS4uLUvARa3GV37MBiQv6pdKnsgycFtvOTYaX2mjnUUcHn5fGRJGptR3/x4EvCZJE8Dbgbe\nwaCQLUuyFLgNOAagqq5LsoxB4VkHnFhVj7XjnAB8CtgJuLS9YDAJ4NNJVgH3Mpg9Jkkak8y2/7Ff\ntGhReUe9tHV71d+8atwpzArfO+l7nfdNcnVVLdrcft5RL0nqjUVFktQbi4okqTcWFUlSbywqkqTe\nWFQkSb2xqEiSemNRkST1xqIiSeqNRUWS1BuLiiSpNxYVSVJvLCqSpN5YVCRJvbGoSJJ6Y1GRJPXG\noiJJ6o1FRZLUG4uKJKk3FhVJUm8sKpKk3lhUJEm9sahIknpjUZEk9caiIknqjUVFktSbkRaVJLcm\nuTbJj5KsaLHdk1yW5Kb2vtvQ/qcmWZXkxiSHDcUPbMdZleSMJGnxHZNc0OJXJlkwyt8jSdq0mThT\neW1VHVBVi9r2KcDyqloILG/bJNkPWAy8EDgcODPJ9q3PWcBxwML2OrzFlwL3VdW+wMeA02fg90iS\nNmIcl7+OAM5t7XOBI4fi51fVo1V1C7AKOCjJHsDOVXVFVRVw3rQ+U8e6EDh06ixGkjTzRl1UCvhG\nkquTHN9i86rqjta+E5jX2vOB24f6rm6x+a09Pb5en6paB9wPPLvvHyFJ6mbOiI//m1W1JsmvA5cl\nuWH4w6qqJDXiHGgF7XiAvffee9RfJ0mz1kjPVKpqTXu/G7gIOAi4q13Sor3f3XZfA+w11H3PFlvT\n2tPj6/VJMgfYBbhnA3mcXVWLqmrR3Llz+/lxkqRfMbKikuTXkjxrqg38NvAT4BJgSdttCXBxa18C\nLG4zuvZhMCB/VbtU9kCSg9t4ybHT+kwd6yjg8jbuIkkag1Fe/poHXNTGzecAn62qryb5AbAsyVLg\nNuAYgKq6LskyYCWwDjixqh5rxzoB+BSwE3BpewGcA3w6ySrgXgazxyRJYzKyolJVNwMv2UD8HuDQ\njfQ5DThtA/EVwP4biD8CHP2Uk5Uk9cI76iVJvbGoSJJ6Y1GRJPXGoiJJ6o1FRZLUm80WlXa/yXat\n/fwkb0qyw+hTkyRNmi5nKt8Bnp5kPvB14O0M7hmRJGk9XYpKqupfgDcDZ1bV0QyWp5ckaT2dikqS\nVwBvA/6xxbbfxP6SpFmqS1F5F3AqcFFbSuV5wDdHm5YkaRJtdpmWqvo28O0kz2jbNwN/MOrEJEmT\np8vsr1ckWQnc0LZfkuTMkWcmSZo4XS5//TVwGO05JVX1Y+DVo0xKkjSZOt38WFW3Tws9tsEdJUmz\nWpel729P8kqg2k2PJwPXjzYtSdIk6nKm8k7gRGA+g8f3HtC2JUlaT5fZXz9jcI+KJEmb1GX217lJ\ndh3a3i3JJ0ebliRpEnW5/PXiqvr51EZV3Qe8dHQpSZImVZeisl2S3aY2kuzOCJ9tL0maXF2Kw0eA\n7yf5PBDgKOC0kWYlSZpIXQbqz0tyNfDaFnpzVa0cbVqSpEnU9TLWDcB9U/sn2buqfjqyrCRJE2mz\nRSXJScD7gLsY3EkfoIAXjzY1SdKk6XKmcjLwgqq6Z9TJSJImW5fZX7cD9486EUnS5OtSVG4GvpXk\n1CR/OPXq+gVJtk/ywyRfbtu7J7ksyU3tfXi68qlJViW5MclhQ/EDk1zbPjsjSVp8xyQXtPiVSRZ0\nzUuS1L8uReWnwGXA04BnDb26mr4A5SnA8qpaCCxv2yTZD1gMvBA4HDgzydRji88CjgMWttfhLb4U\nuK+q9gU+Bpy+BXlJknrWZUrxnwMkeUZV/cuWHDzJnsAbGdzXMnV2cwTwmtY+F/gW8O4WP7+qHgVu\nSbIKOCjJrcDOVXVFO+Z5wJHApa3P+9uxLgQ+kSRVVVuSpySpH6N+8uNfA/8FeHwoNq+q7mjtO4F5\nrT2fwfjNlNUtNr+1p8fX61NV6xiM/Ty7Y26SpJ6N7MmPSf4dcHdVXb2xfdoZxcjPKpIcn2RFkhVr\n164d9ddJ0qw1yic/vgp4U7t8dT5wSJL/CdyVZA+A9n53238NsNdQ/z1bbE1rT4+v1yfJHGAXWvGb\nlv/ZVbWoqhbNnTu3Q+qSpCej05Ti4Sc/JvljOjz5sapOrao9q2oBgwH4y6vqPwGXAEvabkuAi1v7\nEmBxm9G1D4MB+avapbIHkhzcZn0dO63P1LGOat/heIokjUmXmx/fCXycJ578+HWe2pMfPwQsS7IU\nuA04BqCqrkuyDFgJrANOrKqpM6ITgE8BOzEYoL+0xc8BPt0G9e9lULwkSWOyyaLSpvS+vaqe0pMf\nq+pbDGZ50e7MP3Qj+53GBlZArqoVwP4biD8CHP1UcpMk9WeTl7/amcJ/nKFcJEkTrsvlr+8m+QRw\nAfDwVLCqrhlZVpKkidSlqBzQ3v9iKFbAIf2nI0maZJsbU9kOOKuqls1QPpKkCba5MZXHGdwRL0nS\nZnW5T+UbSf44yV5theHdk+w+8swkSROny5jKW9r78L0pBTyv/3QkSZOsyyrF+8xEIpKkydflGfXH\nbiheVef1n44kaZJ1ufz18qH20xncDX8NYFGRJK2ny+Wvk4a3k+zKYNVhSZLW02np+2keBhxnkST9\nii5jKl/iiQdpbQfsB3gzpCTpV3QZU/nwUHsdcFtVrd7YzpKk2atLUfkpcEdbZp4kOyVZUFW3jjQz\nSdLE6TKm8nng8aHtx1pMkqT1dCkqc6rqF1Mbrf200aUkSZpUXYrK2iRvmtpIcgTws9GlJEmaVF2f\nUf+Z9qAugNXABu+ylyTNbl1ufvxn4OAkz2zbD408K0nSRNrs5a8kH0yya1U9VFUPJdktyX+bieQk\nSZOly5jK71TVz6c2quo+4A2jS0mSNKm6FJXtk+w4tZFkJ2DHTewvSZqlugzUfwZYnuTv2/Y7gHNH\nl5IkaVJ1Gag/PcmPgde10Aeq6mujTUuSNIm6nKkA/BDYgcHCkj8cXTqSpEnWZfbXMcBVwFHAMcCV\nSY7q0O/pSa5K8uMk1yX58xbfPcllSW5q77sN9Tk1yaokNyY5bCh+YJJr22dnJEmL75jkgha/MsmC\nLf0PIEnqT5eB+v8KvLyqllTVscBBwHs69HsUOKSqXgIcABye5GDgFGB5VS0ElrdtkuwHLAZeCBwO\nnJlk+3ass4DjgIXtdXiLLwXuq6p9gY8Bp3fIS5I0Il2KynZVdffQ9j1d+tXA1I2SO/DE5bMjeGKg\n/1zgyNY+Aji/qh6tqluAVcBBSfYAdq6qK6qqGDzGeLjP1LEuBA6dOouRJM28LmMqX03yNeBzbfst\nwFe6HLydaVwN7Av8bVVdmWReVd3RdrkTmNfa84ErhrqvbrFftvb0+FSf2wGqal2S+4Fn49pkkjQW\nXWZ//UmSNwO/2UJnV9VFXQ5eVY8BB7Tn2l+UZP9pn1eS2nDv/iQ5HjgeYO+99x7110nSrNVp9ldV\nfQH4wpP9kqr6eZJvMhgLuSvJHlV1R7u0NXVpbQ2w11C3PVtsTWtPjw/3WZ1kDrALg8tz07//bOBs\ngEWLFo28iEnSbNVlTOVJSTK3naFM3YX/euAG4BJgSdttCXBxa18CLG4zuvZhMCB/VbtU9kCSg9t4\nybHT+kwd6yjg8jbuIkkag673qTwZewDntnGV7YBlVfXlJN8HliVZCtzGYJoyVXVdkmXASmAdcGK7\nfAZwAvApYCfg0vYCOAf4dJJVwL0MZo9JksZko0UlyfKqOjTJ6VX17i09cFX9E/DSDcTvAQ7dSJ/T\ngNM2EF8B7L+B+CPA0VuamyRpNDZ1prJHklcCb0pyPrDeVN2qumakmUmSJs6misp7GdzkuCfw0Wmf\nFXDIqJKSJE2mjRaVqroQuDDJe6rqAzOYkyRpQnW5T+UDSd4EvLqFvlVVXx5tWpKkSdRlQcm/BE5m\nMCtrJXBykg+OOjFJ0uTpMqX4jcABVfU4QJJzGSx//6ejTEySNHm63vy461B7l1EkIkmafF3OVP4S\n+GFbZiUMxlZOGWlWkqSJ1GWg/nNJvgW8vIXeXVV3jjQrSdJE6rqg5B0M1tmSJGmjRragpCRp9rGo\nSJJ6s8mikmT7JDfMVDKSpMm2yaLSlp6/MYmPS5QkbVaXgfrdgOuSXAU8PBWsqjeNLCtJ0kTqUlTe\nM/IsJEnbhC73qXw7yXOBhVX1jSTPALYffWqSpEnTZUHJ44ALgf/eQvOBL44yKUnSZOoypfhE4FXA\nAwBVdRPw66NMSpI0mboUlUer6hdTG0nmMHjyoyRJ6+lSVL6d5E+BnZK8Hvg88KXRpiVJmkRdisop\nwFrgWuD3gK8AfzbKpCRJk6nL7K/H24O5rmRw2evGqvLylyTpV2y2qCR5I/B3wD8zeJ7KPkl+r6ou\nHXVykqTJ0uXmx48Ar62qVQBJ/hXwj4BFRZK0ni5jKg9OFZTmZuDBEeUjSZpgGz1TSfLm1lyR5CvA\nMgZjKkcDP5iB3CRJE2ZTZyq/215PB+4Cfgt4DYOZYDtt7sBJ9kryzSQrk1yX5OQW3z3JZUluau+7\nDfU5NcmqJDcmOWwofmCSa9tnZyRJi++Y5IIWvzLJgi3+LyBJ6s1Gz1Sq6h1P8djrgD+qqmuSPAu4\nOsllwH8GllfVh5KcwmDK8ruT7AcsBl4I/AbwjSTPb8vvnwUcx2AG2leAwxmM6SwF7quqfZMsBk4H\n3vIU85YkPUldZn/tA5wELBjef3NL37fn2t/R2g8muZ7BumFHMDjjATgX+Bbw7hY/v6oeBW5Jsgo4\nKMmtwM5VdUXL5zzgSAZF5Qjg/e1YFwKfSBKnPEvSeHSZ/fVF4BwGd9E//mS+pF2WeimDM415reAA\n3AnMa+35wBVD3Va32C9be3p8qs/tAFW1Lsn9wLOBn037/uOB4wH23tvnjUnSqHQpKo9U1RlP9guS\nPBP4B+BdVfVAGw4BoKoqycjPKqrqbOBsgEWLFnkWI0kj0qWofDzJ+4CvA49OBavqms11TLIDg4Ly\nmar6QgvflWSPqrojyR7A3S2+BthrqPueLbamtafHh/usbgtd7gLc0+E3SZJGoEtReRHwduAQnrj8\nVW17o9oMrXOA66vqo0MfXQIsAT7U3i8ein82yUcZDNQvBK6qqseSPJDkYAaXz44F/mbasb4PHAVc\n7niKJI1Pl6JyNPC84eXvO3oVg2J0bZIftdifMigmy5IsBW4DjgGoquuSLANWMpg5dmKb+QVwAvAp\nBlOZL+WJu/nPAT7dBvXvZTB7TJI0Jl2Kyk+AXXniMlUnVfVdBmuFbcihG+lzGnDaBuIrgP03EH+E\nQdGTJG0FuhSVXYEbkvyA9cdUNjmlWJI0+3QpKu8beRaSpG1Cl+epfHsmEpEkTb4ud9Q/yBPPpH8a\nsAPwcFXtPMrEJEmTp8uZyrOm2m2a8BHAwaNMSpI0mbo8T+X/q4EvAodtdmdJ0qzT5fLXm4c2twMW\nAY+MLCNJ0sTqMvvrd4fa64BbGVwCkyRpPV3GVJ7qc1UkSbPEph4n/N5N9Kuq+sAI8pEkTbBNnak8\nvIHYrzF42uKzAYuKJGk9m3qc8Eem2u1xwCcD7wDOBz6ysX6SpNlrk2MqSXYH/hB4G4NH/76squ6b\nicQkSZNnU2MqfwW8mcETE19UVQ/NWFaSpIm0qZsf/4jBw7L+DPi/7UFZDyR5MMkDM5OeJGmSbGpM\nZYvutpckycIhSeqNRUWS1Jsuy7RIE+mnf/Gicaewzdv7vdeOOwVtZTxTkST1xqIiSeqNRUWS1BuL\niiSpNxYVSVJvLCqSpN5YVCRJvRlZUUnyySR3J/nJUGz3JJcluam97zb02alJViW5MclhQ/EDk1zb\nPjsjSVp8xyQXtPiVSRaM6rdIkroZ5ZnKp4DDp8VOAZZX1UJgedsmyX7AYuCFrc+ZSbZvfc4CjgMW\nttfUMZcC91XVvsDHgNNH9kskSZ2MrKhU1XeAe6eFj2DwXBba+5FD8fOr6tGqugVYBRyUZA9g56q6\noqoKOG9an6ljXQgcOnUWI0kaj5keU5lXVXe09p3AvNaeD9w+tN/qFpvf2tPj6/WpqnXA/QwecyxJ\nGpOxDdS3M4+aie9KcnySFUlWrF27dia+UpJmpZkuKne1S1q097tbfA2w19B+e7bYmtaeHl+vT5I5\nwC7APRv60qo6u6oWVdWiuXPn9vRTJEnTzXRRuQRY0tpLgIuH4ovbjK59GAzIX9UulT2Q5OA2XnLs\ntD5TxzoKuLyd/UiSxmRkS98n+RzwGuA5SVYD7wM+BCxLshS4DTgGoKquS7IMWAmsA06sqsfaoU5g\nMJNsJ+DS9gI4B/h0klUMJgQsHtVvkSR1M7KiUlVv3chHh25k/9OA0zYQXwHsv4H4I8DRTyVHSVK/\nvKNektQbi4okqTcWFUlSbywqkqTeWFQkSb2xqEiSemNRkST1xqIiSeqNRUWS1BuLiiSpNxYVSVJv\nLCqSpN5YVCRJvbGoSJJ6Y1GRJPXGoiJJ6o1FRZLUG4uKJKk3FhVJUm8sKpKk3swZdwJbswP/5Lxx\npzArXP1Xx447BUk98UxFktQbi4okqTcWFUlSbywqkqTeWFQkSb2Z+KKS5PAkNyZZleSUcecjSbPZ\nRBeVJNsDfwv8DrAf8NYk+403K0mavSa6qAAHAauq6uaq+gVwPnDEmHOSpFlr0ovKfOD2oe3VLSZJ\nGoNZcUd9kuOB49vmQ0luHGc+I/Yc4GfjTmJL5MNLxp3C1mLi/na8L+POYGsycX+//MEW/f2e22Wn\nSS8qa4C9hrb3bLH1VNXZwNkzldQ4JVlRVYvGnYe2nH+7yebfb2DSL3/9AFiYZJ8kTwMWA5eMOSdJ\nmrUm+kylqtYl+X3ga8D2wCer6roxpyVJs9ZEFxWAqvoK8JVx57EVmRWX+bZR/u0mm38/IFU17hwk\nSduISR9TkSRtRSwq2wiXq5lcST6Z5O4kPxl3LtpySfZK8s0kK5Ncl+Tkcec0Tl7+2ga05Wr+D/B6\nBjeA/gB4a1WtHGti6iTJq4GHgPOqav9x56Mtk2QPYI+quibJs4CrgSNn678/z1S2DS5XM8Gq6jvA\nvePOQ09OVd1RVde09oPA9czilT0sKtsGl6uRtgJJFgAvBa4cbybjY1GRpB4keSbwD8C7quqBcecz\nLhaVbUOn5WokjUaSHRgUlM9U1RfGnc84WVS2DS5XI41JkgDnANdX1UfHnc+4WVS2AVW1DpharuZ6\nYJnL1UyOJJ8Dvg+8IMnqJEvHnZO2yKuAtwOHJPlRe71h3EmNi1OKJUm98UxFktQbi4okqTcWFUlS\nbywqkqTeWFQkSb2xqEg9SrJrkhNm4Htek+SVo/4eaUtZVKR+7Qp0LioZeDL/Dl8DWFS01fE+FalH\nSaZWiL4R+CbwYmA3YAfgz6rq4rbo4NcYLDp4IPAG4HXAu4GfAz8GHq2q308yF/g7YO/2Fe9isATP\nFcBjwFrgpKr6XzPx+6TNsahIPWoF48tVtX+SOcAzquqBJM9hUAgWAs8FbgZeWVVXJPkN4H8DLwMe\nBC4HftyKymeBM6vqu0n2Br5WVf8myfuBh6rqwzP9G6VNmTPuBKRtWIAPtodwPc7gcQTz2me3VdUV\nrX0Q8O2quhcgyeeB57fPXgfsN1heCoCd22q40lbJoiKNztuAucCBVfXLJLcCT2+fPdzxGNsBB1fV\nI8PBoSIjbVUcqJf69SDwrNbeBbi7FZTXMrjstSE/AH4ryW7tktl/GPrs68BJUxtJDtjA90hbDYuK\n1KOqugf4XpKfAAcAi5JcCxwL3LCRPmuADwJXAd8DbgXubx//QTvGPyVZCbyzxb8E/Pu2Iu6/HdXv\nkbaUA/XSViDJM6vqoXamchHwyaq6aNx5SVvKMxVp6/D+JD8CfgLcAnxxzPlIT4pnKpKk3nimIknq\njUVFktQbi4okqTcWFUlSbywqkqTeWFQkSb35f8snYkHplwclAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x19991aaf6a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(test_predicts);\n",
    "pyplot.xlabel('target');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在测试集上预测结果的分布统计图和训练集上的结果统计看起来差不多，好像2更多一点.."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 9. 生成测试结果文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "pd.DataFrame(test_predicts).to_csv('my_test_predicts.csv',index=False,header=False)"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda root]",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
